#ifndef __M_CONSUMER_H__
#define __M_CONSUMER_H__
// 引入自定义日志工具，用于输出消费者创建、销毁等调试信息
#include "../mqcommon/mq_logger.hpp"
// 引入自定义工具类，包含UUID生成、类型转换等辅助功能
#include "../mqcommon/mq_helper.hpp"
// 引入消息属性相关的Protobuf定义，包含BasicProperties消息结构
#include "../mqcommon/mq_msg.pb.h"
// 引入标准库头文件
#include <iostream>
#include <unordered_map>
#include <mutex>
#include <memory>
#include <vector>
#include <functional>

namespace zdfmq
{
    /**
     * @brief 消费者回调函数类型定义，用于处理接收到的消息
     * 函数参数：
     * - const std::string：消费者标签（与订阅时的tag对应，标识当前消费者）
     * - const BasicProperties *bp：消息属性指针（包含消息ID、投递模式、路由键等元数据）
     * - const std::string：消息体（原始业务数据）
     * 用途：当消费者接收到服务器推送的消息时，通过此回调函数将消息传递给业务层处理
     */
    using ConsumerCallback = std::function<void(const std::string, const BasicProperties *bp, const std::string)>;

    /**
     * @brief 消费者结构体，封装了消费者的基本信息和消息处理回调
     * 作用：记录消费者的订阅信息，关联消息处理逻辑，是消息消费流程的核心数据载体
     */
    struct Consumer
    {
        // 定义Consumer的智能指针类型，方便在多线程环境中管理生命周期
        using ptr = std::shared_ptr<Consumer>;

        std::string tag;           // 消费者唯一标识（由客户端或服务器生成，用于区分不同消费者）
        std::string qname;         // 消费者订阅的队列名称（标识消息来源的队列）
        bool auto_ack;             // 自动确认标志：true表示消息推送后自动确认，false需手动调用basicAck确认
        ConsumerCallback callback; // 消息处理回调函数，由业务层注册

        /**
         * @brief 默认构造函数
         * 用途：主要用于创建空消费者对象，后续再手动设置成员变量
         * 调试信息：输出当前对象地址，便于跟踪消费者的创建情况
         */
        Consumer()
        {
            DLOG("new Consumer: %p", this); // 打印新创建的消费者对象地址
        }

        /**
         * @brief 带参构造函数，初始化消费者的核心信息
         * @param ctag 消费者标签
         * @param queue_name 订阅的队列名称
         * @param ack_flag 自动确认标志
         * @param cb 消息处理回调函数（通过std::move转移所有权，减少拷贝）
         * 调试信息：输出当前对象地址，便于跟踪消费者的创建情况
         */
        Consumer(const std::string &ctag, const std::string &queue_name, bool ack_flag, const ConsumerCallback &cb) : tag(ctag), qname(queue_name), auto_ack(ack_flag), callback(std::move(cb))
        {
            DLOG("new Consumer: %p", this); // 打印新创建的消费者对象地址
        }

        /**
         * @brief 析构函数
         * 调试信息：输出当前对象地址，便于跟踪消费者的销毁情况，检测是否存在内存泄漏
         */
        ~Consumer()
        {
            DLOG("del Consumer: %p", this); // 打印被销毁的消费者对象地址
        }
    };
}

#endif